# ====================================================================================
# 文件: scripts/convert_item_list.py
# 描述: [V2 修复版]
#      为 SDKR 预处理步骤准备 item_text.json。
#      此脚本将 data/[dataset]/item_list.txt (空格或制表符分隔)
#      转换为 data/[dataset]/item_text.json (字典格式)。
#
#      - item_list.txt 格式 (来自 book-crossing):
#        org_id<SPACE/TAB>remap_id<SPACE/TAB>item_name
#      - item_text.json 格式 (SDKR 预处理所需):
#        { "remap_id": "item_name", ... }
#
# 如何运行 (在 SDKR 根目录):
# python3 scripts/convert_item_list.py --dataset book-crossing
# ====================================================================================

import os
import json
import argparse
from tqdm import tqdm


def main():
    parser = argparse.ArgumentParser(
        description="将 item_list.txt 转换为 item_text.json"
    )
    parser.add_argument(
        '--dataset',
        type=str,
        required=True,
        help='数据集名称 (例如: book-crossing)'
    )
    args = parser.parse_args()

    # 1. 定义路径
    project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    data_dir = os.path.join(project_root, 'data', args.dataset)

    input_file = os.path.join(data_dir, 'item_list.txt')
    output_file = os.path.join(data_dir, 'item_text.json')

    print(f"--- [Converter] 开始转换 ---")
    print(f"  > 数据集: {args.dataset}")
    print(f"  > 输入: {input_file}")
    print(f"  > 输出 (JSON): {output_file}")

    if not os.path.exists(input_file):
        print(f"❌ 错误: 输入文件未找到: {input_file}")
        return

    # 2. 读取文件并构建字典
    item_meta_dict = {}
    lines_processed = 0
    lines_skipped = 0

    try:
        with open(input_file, 'r', encoding='utf-8') as f:
            # 跳过表头
            header = f.readline()
            print(f"  > 文件头部: {header.strip()}")

            # 使用 tqdm 读取剩余行
            for line_num, line in enumerate(tqdm(f, desc="  > 正在处理 item_list.txt"), start=2):
                line = line.strip()

                # 尝试多种分隔符：先尝试制表符，再尝试空格
                if '\t' in line:
                    # 制表符分隔
                    parts = line.split('\t')
                    separator_type = "制表符"
                else:
                    # 空格分隔 - 只分割前两个空格，保留书名中的空格
                    parts = line.split(' ', 2)  # 最多分割2次，保留剩余部分
                    separator_type = "空格"

                # 检查是否有足够的列
                if len(parts) >= 3:
                    org_id = parts[0].strip()
                    remap_id = parts[1].strip()
                    item_name = parts[2].strip()

                    # 验证 remap_id 是否为数字
                    if remap_id.isdigit() and item_name:
                        item_meta_dict[remap_id] = item_name
                        lines_processed += 1

                        # 打印前几行样本用于调试
                        if lines_processed <= 3:
                            print(
                                f"  > 样本行 {lines_processed}: org_id='{org_id}', remap_id='{remap_id}', item_name='{item_name}' (分隔符: {separator_type})")
                    else:
                        lines_skipped += 1
                        if lines_skipped <= 3:  # 只显示前几个错误样本
                            print(f"  > 跳过行 {line_num}: remap_id='{remap_id}', item_name='{item_name}'")
                else:
                    lines_skipped += 1
                    if lines_skipped <= 3:  # 只显示前几个错误样本
                        print(f"  > 跳过行 {line_num}: 列数不足 ({len(parts)}), 内容: '{line}'")

    except Exception as e:
        print(f"\n❌ 错误: 读取文件时出错: {e}")
        return

    if lines_processed == 0:
        print(f"\n⚠️ 警告: 未能解析任何有效行 (跳过 {lines_skipped} 行)。")
        print("  > 请检查文件分隔符和格式")
        return

    # 3. 写入 JSON
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(item_meta_dict, f, indent=4, ensure_ascii=False)
    except Exception as e:
        print(f"\n❌ 错误: 写入 JSON 文件时出错: {e}")
        return

    print(f"\n✅ [Converter] 成功完成!")
    print(f"  > 处理了 {lines_processed} 行，跳过了 {lines_skipped} 行。")
    print(f"  > 成功保存 {len(item_meta_dict)} 个物品到: {output_file}")

    # 显示一些转换后的样本
    print(f"\n  > 转换样本:")
    sample_keys = list(item_meta_dict.keys())[:3]
    for key in sample_keys:
        print(f"    {key}: {item_meta_dict[key]}")


if __name__ == "__main__":
    main()